package componentes;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import com.uqbar.metalGear.MGSScene;
import com.uqbar.metalGear.MetalGearGame;
import com.uqbar.vainilla.DeltaState;
import com.uqbar.vainilla.GameComponent;
import com.uqbar.vainilla.appearances.FilledArc;
import com.uqbar.vainilla.appearances.Sprite;

import comportamiento.ColisionContenedor;
import comportamiento.ControlesPJ;
import comportamiento.PJRule;

public class Personaje extends GameComponent<MGSScene>{
	
	ArrayList<PJRule> rules = new ArrayList<PJRule>();
	Boolean colisiono = false;
	Boolean cambioColorDeCono = false;
	Boolean conoOculto = false;

	public Personaje(int x, int y, BufferedImage imagen, double velocidad, ControlesPJ controles){
		super(new Sprite(imagen), x, y);
		this.setZ(9);
		
	}

	public void informarXs(){
		System.out.println(this.getScene().getComponentes().get(0).getX());
	}
	
	@Override
	public void update(DeltaState deltaState) {
		
		if(this.hayColision()){
			this.retrocederTodos();
		}
		this.controlDeCono();
		super.update(deltaState);
		this.controlDeFin();
		if(this.getScene().getLlegada().hayColisionConLlegada(this)){
			this.getGame().setCurrentScene(((MetalGearGame)this.getGame()).buildWinScene());
		}
	}
	
	public Boolean hayColision(){
		Boolean colisiona = false;
		for(Componente c : this.getScene().getComponentes()){
			colisiona = colisiona || c.hayColision(this);
		}
		return colisiona;
	}
	
	public void controlDeCono(){
		if(getCambioColorDeCono()){
			if(getConoOculto()){
				for(Vision vi : this.getScene().getConos()){
					Color color = new Color(0f,1f,1f,.3f);
					vi.setColor(color);
					vi.setAppearance(new FilledArc(color, vi.getRadius(), vi.getStartAngle(), vi.getArcAngle()));
				}
				this.setConoOculto(false);
				this.setCambioColorDeCono(false);
			}
			else{
				for(Vision vi : this.getScene().getConos()){
					Color color2 = new Color(0f,0f,0f,.0f);
					vi.setColor(color2);
					vi.setAppearance(new FilledArc(color2, vi.getRadius(), vi.getStartAngle(), vi.getArcAngle()));
				}
				this.setConoOculto(true);
				this.setCambioColorDeCono(false);
			}
		}
	}
	
	public void retrocederTodos(){
		//retroceder fondo, contenedores y demas cosas que agregue
		for(Fondo f : this.getScene().getFondos()){
			f.setX(f.getxAnterior());
			f.setY(f.getyAnterior());
		}
		for(Componente cont : this.getScene().getComponentes()){
			cont.setX(cont.getxAnterior());
			cont.setY(cont.getyAnterior());
		}
		for(Espera esp : this.getScene().getEsperas()){
			esp.setX(esp.getxAnterior());
			esp.setY(esp.getyAnterior());
		}
		for(Soldado sol : this.getScene().getSoldados()){
			if(!(sol.getRecorrido().getEstaEnMovimiento())){
				sol.setX(sol.getxAnterior());
				sol.setY(sol.getyAnterior());
				
			}
			else{
				sol.libreColisionando();
			}
		}
		
		this.getScene().getLlegada().setX(this.getScene().getLlegada().getxAnterior());
		this.getScene().getLlegada().setY(this.getScene().getLlegada().getyAnterior());
		
	}
	
	public void controlDeFin(){
		
		for(Vision v : this.getScene().getConos()){
			if(v.estaEnPosibleColision(this)){
				if(v.detectaPJ(this)){
					this.getGame().setCurrentScene(((MetalGearGame)this.getGame()).buildEndScene());
				}
			}
		}
		
	}

	public Boolean getConoOculto() {
		return conoOculto;
	}

	public void setConoOculto(Boolean conoOculto) {
		this.conoOculto = conoOculto;
	}	
	
	public Boolean getCambioColorDeCono() {
		return cambioColorDeCono;
	}

	public void setCambioColorDeCono(Boolean cambioColorDeCono) {
		this.cambioColorDeCono = cambioColorDeCono;
	}
	
}
